/*
central cache：中心缓存是所有线程所共享，thread cache是按需从central cache中获取的对象。
central cache合适的时机回收thread cache中的对象，避免一个线程占用了太多的内存，而其他线程的内存吃紧，达到内存分配在多个线程中更均衡的按需调度的目的。
central cache是存在竞争的，所以从这里取内存对象是需要加锁，首先这里用的是桶锁，其次只有thread cache的没有内存对象时才会找central cache，所以这里竞争不会很激烈。
*/

#ifndef CCENTRALCACHE_H
#define CCENTRALCACHE_H

#include "Common.h"
#include "PageCache.h"

//中心缓存，单例类
class CentralCache
{
public:
	//获取CentralCache单例类
	static CentralCache* GetInstance() { return m_centralCache; }

	//从 Page cache 获取一个非空的span
	Span* GetOneSpan(SpanList& list, size_t byte_size);

	// 从中心缓存获取一定数量的对象给thread cache
	size_t FetchRangeObj(void*& start, void*& end, size_t batchNum, size_t size);

	// 将一定数量的对象释放到span跨度
	void ReleaseListToSpans(void* start, size_t size);

private:
	CentralCache() {}
	CentralCache(const CentralCache&) = delete;

	SpanList m_spanLists[NFREELISTS]; //在ThreadCache是几号桶，在CentralCache就是几号桶

	//单例类
	static CentralCache* m_centralCache;      
};


#endif // CCENTRALCACHE_H
